package com.MartynovichIgor.KnowledgeTest.questions;

import com.MartynovichIgor.KnowledgeTest.resources.MyResources_en;
import com.MartynovichIgor.KnowledgeTest.tools.testtools.Parser;
import com.MartynovichIgor.KnowledgeTest.tools.testtools.TestController;

import java.util.ArrayList;
import java.util.ResourceBundle;

import static java.lang.System.out;

/**
 * Created by:
 * User: Igor Martynovich and Guzenko Igor
 * Date: 22.10.13
 */
public class QuestionWithVariantsAndSeveralAnswers extends QuestionWithVariantsAndOneAnswer {
    private ArrayList<String> variantsArray;
    private ArrayList<String> userAnswersArray;
    private ResourceBundle resource = new MyResources_en();
    private Parser parser;

    public QuestionWithVariantsAndSeveralAnswers(String question, String condition, String answer, int questionId) {
        super(question, condition, answer, questionId);
        parser = new Parser();
        variantsArray = parser.getStringArray(super.getCondition(), ";");
    }

    /**
     * Метод принимает ответ пользователя и возвращает количество балов за ответ.
     * @param userInput
     * @return Количество балов за ответ.
     */
    @Override
    public int getUserPointForQuestion(String userInput) {
        int localScore = 0;
        userAnswersArray = parser.getStringArray(userInput, ",");
        ArrayList<String> rightAnswersArray = parser.getStringArray(super.getAnswer(), ";");
        String answers = super.getCondition();
        ArrayList<String> answerVariantsArray = new Parser().getStringArray(answers, ";");
        if (userAnswersArray.size() <= answerVariantsArray.size()) {
            if (isAllDifferent(userAnswersArray)) {
                localScore = setScores(rightAnswersArray);
            }
        }
        if (localScore < 0)
            localScore = 0;
        return localScore;
    }

    @Override
    public void printCondition() {
        resource = TestController.getLanguageChooser();
        for (int i = 0; i < variantsArray.size(); i++) {
            out.printf("%s%s ", resource.getObject(String.valueOf((char) ('a' + i))), variantsArray.get(i));
        }
        out.println();
    }

    /**
     * Проверяет наличие в ответах пользователя одинаковых вариантов.
     * @param userAnswers
     * @return Если есть одинаковые варианты - false.
     */
    private boolean isAllDifferent(ArrayList<String> userAnswers) {
        boolean isDifferent = true;
        for (int i = 0; i < userAnswers.size() - 1; i++) {
            for (int j = i + 1; j < userAnswers.size(); j++) {
                if (userAnswers.get(i).equals(userAnswers.get(j))) {
                    isDifferent = false;
                    break;
                }
            }
            if (!isDifferent)
                break;
        }
        return isDifferent;
    }

    /**
     * Сравнивает массив ответов пользователя с массивом правельных ответов.
     * @param rightAnswersArray
     * @return Возврашает количество правельных ответов пользователя.
     */
    private int setScores(ArrayList<String> rightAnswersArray) {
        int localScore = 0;
        setRealAnswers();
        for (String userVariant : userAnswersArray) {
            if (rightAnswersArray.contains(userVariant)) {
                localScore++;
            } else {
                localScore--;
            }
        }
        return localScore;
    }

    private void setRealAnswers() {
        for(int i = 0;i < userAnswersArray.size();i++) {
            if ((userAnswersArray.get(i) + ")").equals(resource.getString("a"))) {
                userAnswersArray.set(i, variantsArray.get(0));
            }
            if ((userAnswersArray.get(i) + ")").equals(resource.getString("b"))) {
                userAnswersArray.set(i, variantsArray.get(1));
            }
            if ((userAnswersArray.get(i) + ")").equals(resource.getString("c"))) {
                userAnswersArray.set(i, variantsArray.get(2));
            }
            if ((userAnswersArray.get(i) + ")").equals(resource.getString("d"))) {
                userAnswersArray.set(i, variantsArray.get(3));
            }
            if ((userAnswersArray.get(i) + ")").equals(resource.getString("e"))) {
                userAnswersArray.set(i, variantsArray.get(4));
            }
        }
    }
}
